﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Utiles.Persistencia;
using EntidadesDeNegocio;
using System.Data.SqlClient;
using Utiles.Excepcion;
namespace PersistenciaSql
{
    class BrokerHistoricoProduccion:Broker
    {
        public override void Insertar(ObjetoPersistente obj)
        {
            HistoricoProduccion hist = (HistoricoProduccion)obj;
            Produccion prod = hist.Produccion;
            SqlConnection conn = ConexionBDManejador.CreaConexion();
            try
            {
                conn.Open();
                foreach (Componente c in prod.DisenoProduccion.ListaComponentes)
                {
                    string sql = @"Insert into HistoricoProducciones (idProduccion,idComponente,StockInicial,StockFinal) " +
                             " values (@idProduccion,@idComponente,@StockInicial,@StockFinal)";
                    SqlCommand comm = new SqlCommand(sql, conn);
                    Componente compEnStock = Stock.Instancia.ObtenerComponente(c.Modelo);
                    comm.Parameters.Add("@idProduccion", System.Data.SqlDbType.Int).Value = prod.Oid;                    
                    comm.Parameters.Add("@IdComponente", System.Data.SqlDbType.Int).Value = c.Oid;
                    comm.Parameters.Add("@StockInicial", System.Data.SqlDbType.Int).Value = (compEnStock.Cantidad + (c.Cantidad*prod.CantidadSolicitada));
                    comm.Parameters.Add("@StockFinal", System.Data.SqlDbType.Int).Value = compEnStock.Cantidad;                    
                    comm.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                throw new BDExcepcion("Error al guardar Historico de la Produccion: " + ex.Message);                
            }
            finally
            {
                conn.Close();
            }                    
        }

        public override void Actualizar(Utiles.Persistencia.ObjetoPersistente obj)
        {
            throw new NotImplementedException();
        }

        public override void Borrar(Utiles.Persistencia.ObjetoPersistente obj)
        {
            throw new NotImplementedException();
        }

        public override List<Utiles.Persistencia.ObjetoPersistente> SeleccionaTodo()
        {
            List<ObjetoPersistente> listaRetorno = new List<ObjetoPersistente>();

            string sql = "select p.Oid,p.DisenoProduccion,p.CantidadProducida,p.CantidadSolicitada,p.FechaFinProduccion,p.FechaInicioProduccion ,c.Modelo as ModeloComponente,hp.StockInicial,hp.StockFinal from Produccion p,HistoricoProducciones hp , Componentes c where p.Oid=hp.idProduccion and c.Oid = hp.idComponente";

            SqlConnection conn = ConexionBDManejador.CreaConexion();
            SqlCommand comm = new SqlCommand(sql, conn);
            try
            {
                conn.Open();
                SqlDataReader reader = comm.ExecuteReader();
                while (reader.Read())
                {
                    HistoricoProduccion hist = new HistoricoProduccion(new Produccion());
                    Produccion prod = hist.Produccion;
                    prod.Oid = reader.GetInt32(reader.GetOrdinal("Oid"));
                    prod.CantidadProducida = reader.GetInt32(reader.GetOrdinal("CantidadProducida"));
                    prod.CantidadSolicitada = reader.GetInt32(reader.GetOrdinal("CantidadSolicitada"));
                    prod.DisenoProduccion = Sistema.Instancia.ListaDisenos.Where(x => x.Oid == reader.GetInt32(reader.GetOrdinal("DisenoProduccion"))).First();
                    prod.FechaInicioProduccion = reader.GetDateTime(reader.GetOrdinal("FechaInicioProduccion"));
                    prod.FechaFinProduccion = reader.GetDateTime(reader.GetOrdinal("FechaFinProduccion"));
                    hist.Componente = Stock.Instancia.ObtenerComponente(reader.GetString(reader.GetOrdinal("ModeloComponente")));
                    hist.StockInicial = reader.GetInt32(reader.GetOrdinal("StockInicial"));
                    hist.StockFinal = reader.GetInt32(reader.GetOrdinal("StockFinal"));                    
                    listaRetorno.Add(hist);
                }
            }
            catch (Exception ex)
            {
                throw new BDExcepcion("Error al seleccionar los Historicos de Producciones: " + ex.Message);
            }
            finally
            {
                conn.Close();
            }
            return listaRetorno;
        }

        public override Utiles.Persistencia.ObjetoPersistente SeleccionaUno(Utiles.Persistencia.ObjetoPersistente obj)
        {
            throw new NotImplementedException();
        }

        public override int ObtenerUltimoOid()
        {
            throw new NotImplementedException();
        }
    }
}
